<?php
//require_once(APPPATH."classes/estado.php");
require_once(APPPATH."classes/abstract/udbase.php");
require_once(APPPATH."classes/abstract/udentity.php");
require_once(APPPATH."classes/concrete/tamanho_repository.php");
require_once(APPPATH."classes/concrete/ingrediente_repository.php");
require_once(APPPATH."classes/util/udutil.php");
require_once(APPPATH."classes/empresa.php");
require_once(APPPATH."classes/categoria.php");
require_once(APPPATH."classes/tamanho.php");
require_once(APPPATH."classes/item.php");
require_once(APPPATH."classes/tamanho_item.php");
require_once(APPPATH."classes/ingrediente.php");
require_once(APPPATH."classes/ingrediente_item.php");
require_once(APPPATH."classes/segmento.php");
require_once(APPPATH."classes/forma_pagto.php");

class Empresa_model extends CI_Model {

    public function __construct() {
        parent::__construct();
    }

    public function login($email, $senha){
    	$validacao = array(true, '');
        $empresa   = new Empresa($email);

        if($empresa->hasID()){

            if($empresa->comparePassword($senha)){
                if($empresa->isAtivo()){
                    if( ! $empresa->isBloqueada()){
                        $validacao = array(true, $empresa->getCodEmpresa(), $empresa->getNomeFantasia());
                    }else{
                        $validacao = array(false, 'Seu cadastro está bloqueado. Caso queira reativar, entre em '.anchor('universo_delivery/contato', 'Contato').'.');
                    }
                }else{
                    $validacao = array(false, 'Cadastro não foi ativado. Confira seu e-mail.');
                }
            }else{
                $validacao = array(false, 'Senha não confere.');
            }

        }else{
            $validacao = array(false, 'Usuário não encontrado.');
        }

    	return $validacao;
    }

    //
    // Cardapio
    //
    public function getCategorias($cod_empresa_auto){
        $categorias = array();

        $this->db->where('cod_empresa_auto', $cod_empresa_auto);
        $query = $this->db->get('categoria');

        foreach($query->result() as $cat){
            $categorias[] = new Categoria($cat->cod_categoria_auto);
        }

        return $categorias;
    }

    public function empresasPorSegmento($cod_segmento_auto = 0, $rand = false, $limit = false){
        $retorno = array();

        $select   = ' 
                    SELECT DISTINCT e.cod_empresa_auto, e.nome_fantasia, SUBSTR(NOME_FANTASIA, 1, 1) primeira_letra
                      FROM  empresa e
                     INNER JOIN segmento_emp se ON se.cod_empresa_auto = e.cod_empresa_auto
                     INNER JOIN item i ON i.cod_empresa_auto = e.cod_empresa_auto
                     INNER JOIN tamanho_item ti ON ti.cod_item_auto = i.cod_item_auto
                     INNER JOIN forma_pagto_emp fp ON fp.cod_empresa_auto = e.cod_empresa_auto
                     WHERE e.data_ativacao IS NOT NULL
                       AND e.empresa_bloqueada = 0
                       AND i.item_indisponivel = 0';
        
        if($cod_segmento_auto > 0){
            $select .= '   AND se.cod_segmento_auto = ' . $cod_segmento_auto;
        }

        if($rand){
            $select .= ' ORDER BY RAND() ';
        }else{
            $select .= ' ORDER BY e.nome_fantasia ';
        }

        if($limit){
            $select .= ' LIMIT ' . $limit;
        }

        $query = $this->db->query($select);

         if($query && $query->num_rows() > 0){
            $retorno = $query->result();
        }

        return $retorno;
    }

    public function getStatistics($cod_empresa_auto){

        $retorno = array(
            "pedidos_hoje"          => 0,
            "pedidos_total"         => 0,
            "clientes_bloqueados"   => 0,
            "clientes_total"        => 0,
            "cardapio_categorias"   => 0,
            "cardapio_itens"        => 0,
            "cardapio_tamanhos"     => 0,
            "cardapio_ingredientes" => 0,
        );

        //
        // Pedidos
        //

        $select = '
                SELECT COALESCE(COUNT(p.cod_pedido_auto), 0)total,
                       COALESCE(SUM(CASE WHEN p.data_pedido = DATE(NOW()) THEN 1 ELSE 0 END), 0) hoje
                  FROM pedido p
                 INNER JOIN forma_pagto_emp fpe ON p.cod_forma_emp_auto = fpe.cod_forma_emp_auto
                 WHERE fpe.cod_empresa_auto  = ?';

        $query = $this->db->query($select, $cod_empresa_auto);
        $row   = $query->row();

        $retorno["pedidos_hoje"]  = $row->hoje;
        $retorno["pedidos_total"] = $row->total;

        //
        // Clientes
        //

        $select = '
                SELECT COALESCE(COUNT(cod_cliente_auto), 0) total,
                       COALESCE(SUM(CASE WHEN bloqueado = 1 THEN 1 ELSE 0 END), 0) bloqueado
                  FROM (
                SELECT  DISTINCT cli.cod_cliente_auto,
                                 cli_blo.bloqueado
                  FROM pedido p
                 INNER JOIN forma_pagto_emp fpe ON p.cod_forma_emp_auto = fpe.cod_forma_emp_auto
                 INNER JOIN local_entrega len ON len.cod_local_auto = p.cod_local_auto
                 INNER JOIN cliente cli ON cli.cod_cliente_auto = len.cod_cliente_auto
                  LEFT JOIN cliente_bloqueado cli_blo ON cli_blo.cod_cliente_auto = cli.cod_cliente_auto
                                                     AND cli_blo.cod_empresa_auto = fpe.cod_empresa_auto
                                                     AND cli_blo.bloqueado = 1
                 WHERE fpe.cod_empresa_auto = ?
                   AND cli.cliente_bloqueado = 0
                    ) aux';
    
        $query = $this->db->query($select, $cod_empresa_auto);
        $row   = $query->row();

        $retorno["clientes_bloqueados"] = $row->bloqueado;
        $retorno["clientes_total"] = $row->total;

        //
        // Cardapio
        //
        $select   = ' 
                    SELECT COALESCE(COUNT(*), 0) qtde
                      FROM categoria
                     WHERE cod_empresa_auto = ?';

        $query = $this->db->query($select, $cod_empresa_auto);
        $row   = $query->row();

        $retorno["cardapio_categorias"] = $row->qtde;

        $select   = ' 
                    SELECT COALESCE(COUNT(*), 0) qtde
                      FROM item
                     WHERE cod_empresa_auto = ?';

        $query = $this->db->query($select, $cod_empresa_auto);
        $row   = $query->row();

        $retorno["cardapio_itens"] = $row->qtde;

        $select   = ' 
                    SELECT COALESCE(COUNT(*), 0) qtde
                      FROM tamanho
                     WHERE cod_empresa_auto = ?';

        $query = $this->db->query($select, $cod_empresa_auto);
        $row   = $query->row();

        $retorno["cardapio_tamanhos"] = $row->qtde;

        $select   = ' 
                    SELECT COALESCE(COUNT(*), 0) qtde
                      FROM ingrediente
                     WHERE cod_empresa_auto = ?';

        $query = $this->db->query($select, $cod_empresa_auto);
        $row   = $query->row();
        
        $retorno["cardapio_ingredientes"] = $row->qtde;

        return $retorno;
    }

    //
    // Cadastro
    //

    public function recuperarSenha($email) {
        $this->load->helper('text');

        $this->db->select('cod_empresa_auto');
        $this->db->where('email_empresa', $email);
        $query = $this->db->get('empresa');

        if ($query && $query->num_rows() > 0){
            $html_email = ascii_to_entities($this->html_rec_senha($query->row()->cod_empresa_auto, $email));

            $this->load->library('email', $this->config->item('ud_emailconfig'));
            $this->email->set_newline('\r\n');
            $this->email->from($this->config->item('ud_emailfromemail'), $this->config->item('ud_emailfromname'));
            $this->email->to($email);
            $this->email->subject('Recuperação de Senha - Universo Delivery');
            $this->email->message($html_email);
            $this->email->send();
        }
    }

    public function alterarSenha($idEmpresa){
        $this->load->helper('text');
        $this->load->helper('string');

        $empresa = new Empresa($idEmpresa);

        if ($empresa->hasID()){
            $nova_senha = random_string('alnum', 8);

            $empresa->setSenha($nova_senha);
            $empresa->gravar();

            $html_email = ascii_to_entities($this->html_nova_senha($nova_senha));

            $this->load->library('email', $this->config->item('ud_emailconfig'));
            $this->email->set_newline('\r\n');
            $this->email->from($this->config->item('ud_emailfromemail'), $this->config->item('ud_emailfromname'));
            $this->email->to($empresa->getEmail());
            $this->email->subject('Recuperação de Senha - Universo Delivery');
            $this->email->message($html_email);
            $this->email->send();
        }else{
            return false;
        }

        return true;
    }


    public function getListaPedidos($cod_empresa_auto, $hoje = false, $page = false, $limit = 10){
        $select = '
                SELECT p.cod_pedido_auto,
                       p.data_pedido,
                       p.hora_pedido,
                       cli.nome,
                       p.total_pedido,
                       COUNT(ip.cod_item_ped_auto) qtde
                  FROM pedido p
                 INNER JOIN item_pedido ip ON ip.cod_pedido_auto = p.cod_pedido_auto
                 INNER JOIN forma_pagto_emp fpe ON p.cod_forma_emp_auto = fpe.cod_forma_emp_auto
                 INNER JOIN local_entrega len ON len.cod_local_auto = p.cod_local_auto
                 INNER JOIN cliente cli ON cli.cod_cliente_auto = len.cod_cliente_auto
                 WHERE fpe.cod_empresa_auto  = ' . $cod_empresa_auto;
        
        if($hoje){
            $select .= ' AND p.data_pedido = \'' . date("Y-m-d") . '\' ';
        }else{
            $select .= ' AND p.data_pedido != \'' . date("Y-m-d") . '\' ';
        }

        $select .= " GROUP BY 1,2,3,4,5 ";
        $select .= " ORDER BY p.cod_pedido_auto DESC ";

        if($page !== FALSE){
            $select .= " LIMIT " . (($page - 1) * $limit) . ", " . $limit;            
        }

        $query = $this->db->query($select);

        return $query->result();
    }

    public function getQtdPaginasHistorico($cod_empresa_auto, $limit = 10){
         $select = '
                SELECT COUNT(*) qtde
                  FROM pedido p
                 INNER JOIN forma_pagto_emp fpe ON p.cod_forma_emp_auto = fpe.cod_forma_emp_auto
                 INNER JOIN local_entrega len ON len.cod_local_auto = p.cod_local_auto
                 INNER JOIN cliente cli ON cli.cod_cliente_auto = len.cod_cliente_auto
                 WHERE fpe.cod_empresa_auto  = ' . $cod_empresa_auto;
        
        $select .= ' AND p.data_pedido != \'' . date("Y-m-d") . '\' ';
        
        $query = $this->db->query($select);
        $row = $query->row();

        $total_paginas = ceil($row->qtde / $limit);

        return $total_paginas;
    }

    public function getPedido($cod_empresa_auto, $cod_pedido_auto){
        $pedido = array();

        $select = "
                SELECT p.cod_pedido_auto,
                       p.total_itens pedido_total_itens,
                       p.taxa_entrega pedido_taxa_entrega,
                       p.total_pedido pedido_total,
                       fp.desc_forma_pagto pedido_forma_pagto,
                       cli.nome cliente_nome,
                       cli.email_cliente cliente_email,
                       CASE WHEN cli.celular > '' THEN cli.celular ELSE cli.telefone END cliente_telefone,
                       len.desc_local_entrega local_desc,
                       len.endereco local_endereco,
                       len.numero local_numero,
                       len.bairro local_bairro, 
                       len.cep local_cep, 
                       len.obs local_obs
                  FROM pedido p
                 INNER JOIN forma_pagto_emp fpe ON p.cod_forma_emp_auto = fpe.cod_forma_emp_auto
                 INNER JOIN forma_pagto fp ON fp.cod_forma_auto = fpe.cod_forma_auto
                 INNER JOIN local_entrega len ON len.cod_local_auto = p.cod_local_auto
                 INNER JOIN cliente cli ON cli.cod_cliente_auto = len.cod_cliente_auto
                 WHERE p.cod_pedido_auto = ?
                   AND fpe.cod_empresa_auto = ?";
        
        $query = $this->db->query($select, array($cod_pedido_auto, $cod_empresa_auto));

        if($query && $query->num_rows() > 0){
            $row = $query->row();
            

            $select = "
                    SELECT ip.cod_item_ped_auto,
                           i.desc_item,
                           t.cod_tamanho,
                           ip.preco_unitario,
                           ip.qtd_item,
                           ip.subtotal_item
                      FROM item_pedido ip
                     INNER JOIN item i ON i.cod_item_auto = ip.cod_item_auto
                     INNER JOIN tamanho t ON t.cod_tamanho_auto = ip.cod_tamanho_auto
                     WHERE ip.cod_pedido_auto = ?";

            $query = $this->db->query($select, $row->cod_pedido_auto);

            if($query && $query->num_rows() > 0){
                $pedido["geral"] = $row;
                $pedido["itens"] = array();

                foreach($query->result() as $row){
                    $item = array(
                        "geral"      => $row,
                        "adicionais" => array()
                    );

                    $select = "
                    SELECT i.desc_ingrediente, ad.preco_unitario, ad.subtotal_adic
                      FROM adicional_item_ped ad
                     INNER JOIN ingrediente i ON i.cod_ingre_auto = ad.cod_ingre_auto
                    WHERE ad.cod_item_ped_auto = ?";

                    $query2 = $this->db->query($select, $row->cod_item_ped_auto);

                    if($query2 && $query2->num_rows() > 0){
                        foreach($query2->result() as $row){
                            $item["adicionais"][] = $row;
                        }
                    }

                    $pedido["itens"][] = $item;
                }
            }

        }

        return $pedido;
    }

    public function clienteBloqueado($cod_empresa_auto, $cod_cliente_auto){
        $this->db->where('cod_empresa_auto', $cod_empresa_auto);
        $this->db->where('cod_cliente_auto', $cod_cliente_auto);
        $this->db->where('bloqueado', 1);

        return $this->db->count_all_results('cliente_bloqueado') > 0;
    }

    private function html_rec_senha($idEmpresa, $email){
        $this->load->library('encrypt');
        $chaveRecSenha = $this->encrypt->encode($idEmpresa);
        
        $html = '';
        $html .= '<table style="width:600px;" cellspacing="0" cellpadding="0">';
        $html .= '  <tr>';
        $html .= '      <td style="width:230px; text-align:left; border-bottom:1px solid #ccc;">';
        $html .= '          <img src="'.base_url('assets/images/logo.png').'" alt="Universo Delivery" />';
        $html .= '      </td>';
        $html .= '      <td style="text-align:left; font-family: Arial, Helvetica, sans-serif; font-size:22px; color:gray; border-bottom:1px solid #ccc;">';
        $html .= '          Recuperação de Senha';
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '  <tr>';
        $html .= '      <td colspan="2">';
        $html .= '          <div style="font-family: Arial, Helvetica, sans-serif; font-size:12px; padding-top:15px;">';
        $html .= '              Olá,';
        $html .= '              Uma solicitação para recuperação de senha foi solicitada para sua empresa no <strong>Universo Delivery</strong>.';
        $html .= '              ';
        $html .= '              <div style="padding:10px; border:1px solid red; margin:25px 0; text-align:center;">';
        $html .= '                  <strong style="color:red;">Importante!</strong> Caso não tenha feito a solicitação, ignore esta mensagem.';
        $html .= '              </div>';
        $html .= '              ';
        $html .= '              Para receber uma nova senha, acesse o endereço abaixo:';
        $html .= '              ';
        $html .= '              <div style="padding:10px; border:1px solid #ccc; word-break:break-all; background:#f0f0f0; margin:10px 0; text-align:center;">';
        $html .= '                  '.anchor('confirmation/cpass/'.$chaveRecSenha, site_url('confirmation/cpass/'.$chaveRecSenha));
        $html .= '              </div>';
        $html .= '          </div>';
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '  <tr>';
        $html .= '      <td colspan="2" style="font-size:10px; padding:10px; border-top:1px solid #ccc; font-family:Arial, Helvetica, sans-serif; text-align:center;">';
        $html .= '          <strong>Universo Delivery</strong>, mata a fome rapidinho!';
        $html .= br();
        $html .= anchor('', site_url());
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '</table>';

        return $html;
    }

    private function html_nova_senha($senha){
        $html = '';
        $html .= '<table style="width:600px;" cellspacing="0" cellpadding="0">';
        $html .= '  <tr>';
        $html .= '      <td style="width:230px; text-align:left; border-bottom:1px solid #ccc;">';
        $html .= '          <img src="'.base_url('assets/images/logo.png').'" alt="Universo Delivery" />';
        $html .= '      </td>';
        $html .= '      <td style="text-align:left; font-family: Arial, Helvetica, sans-serif; font-size:22px; color:gray; border-bottom:1px solid #ccc;">';
        $html .= '          Recuperação de Senha';
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '  <tr>';
        $html .= '      <td colspan="2">';
        $html .= '          <div style="font-family: Arial, Helvetica, sans-serif; font-size:12px; padding-top:15px;">';
        $html .= '              Olá,';
        $html .= '              Anote sua nova senha no <strong>Universo Delivery</strong>.';
        $html .= '              <div style="padding:10px; border:1px solid #ccc; word-break:break-all; background:#f0f0f0; margin:10px 0; text-align:center;">';
        $html .= '                  '.$senha;
        $html .= '              </div>';
        $html .= '              É recomendável alterar sua senha no painel de controle do Universo Delivery.';
        $html .= br();
        $html .= br();
        $html .= '          </div>';
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '  <tr>';
        $html .= '      <td colspan="2" style="font-size:10px; padding:10px; border-top:1px solid #ccc; font-family:Arial, Helvetica, sans-serif; text-align:center;">';
        $html .= '          <strong>Universo Delivery</strong>, mata a fome rapidinho!';
        $html .= br();
        $html .= anchor('', site_url());
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '</table>';

        return $html;
    }

}

class Carrinho extends UDBase {
    protected $cod_empresa_auto;
    protected $tamanhos;

    protected $empresa;
    protected $produtos;

    public function __construct($cod_empresa_auto, $tamanhos){
        $this->cod_empresa_auto = $cod_empresa_auto;
        $this->tamanhos         = $tamanhos;    

        $this->empresa  = new Empresa($this->cod_empresa_auto);
        $this->produtos = array();

        foreach($tamanhos as $cod=>$tam){
            $this->produtos[] = new CarrinhoItem($cod, $tam["quantidade"], $tam["ingredientes"]);
        }
    }

    public function getProdutos(){
        return $this->produtos;
    }

    public function getEmpresa(){
        return $this->empresa;
    }

    public function getTotalItens(){
        $totalItens = 0;

        foreach($this->produtos as $prd){
            // Item
            $totalItens += $prd->getQuantidade() * $prd->getTamanho()->getPreco();

            // Total adicionais
            foreach($prd->getAdicionais() as $adicional){
                $totalItens += $prd->getQuantidade() * $adicional->getIngrediente()->getPrecoIngrediente();
            }
        }

        return $totalItens;
    }

    public function getTaxaEntrega(){
        return $this->empresa->getTaxaEntrega();
    }

    public function getSubTotal(){
        return $this->getTotalItens() + $this->getTaxaEntrega();
    }
}


class CarrinhoItem extends UDBase {
    protected $cod_tam_item_auto;
    protected $quantidade;
    protected $ingredientes;

    protected $tamanho;
    protected $adicionais;

    public function __construct($cod_tam_item_auto, $quantidade, $ingredientes){
        $this->cod_tam_item_auto = $cod_tam_item_auto;
        $this->tamanho           = new Tamanho_item($cod_tam_item_auto);
        $this->quantidade        = $quantidade;
        $this->ingredientes      = $ingredientes;

        $this->adicionais        = array();

        if(is_array($this->ingredientes)){
            foreach($this->ingredientes as $ingrediente){
                $this->adicionais[] = new Ingrediente_item($ingrediente);                
            }
        }
    }

    public function getTamItemAuto(){
        return $this->cod_tam_item_auto;
    }

    public function getTamanho(){
        return $this->tamanho;
    }

    public function getQuantidade(){
        return $this->quantidade;
    }

    public function getAdicionais(){
        return $this->adicionais;
    }
}